package work.month06.day01;

import java.util.Date;
import java.util.Calendar;

/**
 * @date 2020/06/01（儿童节快乐）
 * @author 王光浩
 * @need 构造方法： 
 * 			private DateHelper() ; 
 * 		  类方法： 
 * 			public DateHelper getInstance(); //用于获取一个 DateHelper对象 
 * 		  实例方法： 
 * 			根据传入的参数返回一个 Date对象 
 * 		（1）public Date toDate(int year, int month, int date, int hourOfDay, int minute, int second, int millis) 
 *      （2）public Date toDate(int year, int month, int date, int hourOfDay, int minute, int second) 
 *      （3）public Date toDate(int year, int month, int date, int hourOfDay, int minute) 
 *      	定义一个 toString方法，根据 Calendar/Date 对象，获取其表示的时间（xxxx年xx月xx日 xx:xx:xx.xxx） 
 *      （1）public String toString( final Date date ) 
 *      （2）public String toString( final Calendar date )
 *      	定义一个统计两个日期相差天数的方法
 *      （1）public int durationOfDays( Date first , Date second )
 */
public class DateHelper {
	private Date da = null;
	private Calendar calendar = null;
	private static DateHelper dateHelper = null;

	/**
	 * 构造方法
	 */
	private DateHelper() {
		this.calendar = Calendar.getInstance();
	}

	// ------------- 类方法 --------
	/**
	 * 获取 Datehelper 对象的实例
	 * 
	 * @return
	 */
	public static DateHelper getInstance() {
		if (dateHelper == null)
			dateHelper = new DateHelper();
		return dateHelper;
	}

	// ------------ 实例方法 --------

	/**
	 * 根据指定的时间值获取一个对应的 Date 对象
	 * 
	 * @param year
	 * @param month
	 * @param date
	 * @param hourOfDay
	 * @param minute
	 * @param second
	 * @param millis
	 * @return Date object
	 */
	public Date toDate(int year, int month, int date, int hourOfDay, int minute, int second, int millis) {
		this.clear();
		calendar.set(Calendar.YEAR, year);
		calendar.set(Calendar.MONTH, month);
		calendar.set(Calendar.DATE, date);
		calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
		calendar.set(Calendar.MINUTE, minute);
		calendar.set(Calendar.SECOND, second);
		calendar.set(Calendar.MILLISECOND, millis);
		return calendar.getTime();
	}

	/**
	 * 根据指定的时间值获取一个对应的 Date 对象
	 * 
	 * @param year
	 * @param month
	 * @param date
	 * @param hourOfDay
	 * @param minute
	 * @param second
	 * @return Date object
	 */
	public Date toDate(int year, int month, int date, int hourOfDay, int minute, int second) {
		return this.toDate(year, month, date, hourOfDay, minute, second, 0);
	}

	/**
	 * 根据指定的时间值获取一个对应的 Date 对象
	 * 
	 * @param year
	 * @param month
	 * @param date
	 * @param hourOfDay
	 * @param minute
	 * @return Date object
	 */
	public Date toDate(int year, int month, int date, int hourOfDay, int minute) {
		return this.toDate(year, month, date, hourOfDay, minute, 0, 0);
	}

	/**
	 * 根据传入的 Calendar对象 获取对应时间的字符串	
	 * @param date
	 * @return
	 */
	public String toString(final Calendar date) {
		StringBuilder sb = new StringBuilder();
		sb.append(date.get(Calendar.YEAR) + "年");
		int month = date.get(Calendar.MONTH) + 1;
		sb.append( (month < 10 ? "0"+month : month)  + "月");
		int day = date.get(Calendar.DATE);
		sb.append( (day < 10 ? "0"+day : day) + "日 ");
		int hour = date.get(Calendar.HOUR_OF_DAY);
		sb.append( (hour < 10 ? "0"+hour : hour) + ":");
		int minute = date.get(Calendar.MINUTE);
		sb.append( (minute < 10 ? "0"+minute : minute) + ":");
		int second = date.get(Calendar.SECOND);
		sb.append( (second < 10 ? "0"+second : second) + ":" );
		int millis = date.get(Calendar.MILLISECOND);
		sb.append( millis );
		return sb.toString();
	}

	/**
	 * 根据传入的 Calendar对象 获取对应时间的字符串	
	 * @param date
	 * @return
	 */
	public String toString(final Date date) {
		this.clear();
		calendar.setTime(date);
		return toString(calendar);
	}
	
	/**
	 * 计算两个 Date 时间相差的天数（将 毫秒转化为 小时，然后计算天数）
	 * @param first
	 * @param second
	 * @return
	 */
	public int durationOfDays( Date first , Date second ) {
		if (first.equals(second))
			return 0;
		int flag = second.after(first) ? 1 : -1;
		long value = Math.abs(second.getTime() - first.getTime());
		value = value/3600000;  //转化为时
		long day = value/24 + (value%24 == 0 ? 0 : 1 ); //天数
		return (int)day*flag;
		
	}
	
	/**
	 * 将 Calendar对象进行清零
	 */
	private void clear() {
		calendar.clear();
	}
	
	public static void main(String[] args) {
		DateHelper dh = DateHelper.getInstance(); // 获取 DateHelper 实例
	    
	    Date first = dh.toDate( 2000 , 4 , 30 , 5 , 50 ); // 获取 Date 实例
	    System.out.println( dh.toString( first ) ); // 输出 2000年05月30日 05:50:00.000
	    
	    Date second = dh.toDate( 2020 , 5 , 1 , 18 , 20 , 35 ); // 获取 Date 实例
	    System.out.println( dh.toString( second ) ); // 输出 2020年06月01日 18:20:35.000
	    
	    int days1 = dh.durationOfDays( first , second ) ; // 统计 first 和 second 之间间隔的天数
	    System.out.println( days1 ); 
	    
	    int days2 = dh.durationOfDays( second , first ) ; // 统计 second 和 first 之间间隔的天数
	    System.out.println( days2 ); 
	}
	
}
